﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//联合体
//特点是所有成员公用一块空间

//union un
//{
//	char c;
//	int i;
//};
//int main()
//{
//	union un u = { 0 };
//	printf("%zd\n", sizeof(u));
//
//}


//打印其所有变量地址
//union un
//{
//	char c;
//	int i;
//};
//int main()
//{
//	union un u = { 0 };
//	printf("%zd\n", sizeof(u));
//	printf("%p\n", &u);
//	printf("%p\n", &(u.c));
//	printf("%p\n", &(u.i));
//}




//union un
//{
//	char c;
//	int i;
//};
//int main()
//{
//	union un u = { 0 };
//	u.i = 0x11223344;
//	u.c = 0x55;
//	printf("%zd\n", sizeof(u));
//	printf("%p\n", &u);
//	printf("%p\n", &(u.c));
//	printf("%p\n", &(u.i));
//	printf("%x\n", u.i);
//}
//低地址值改变了，小端存储
//所以，同一时间只使用其一个成员，因为会相互影响！


//所占字节是最大对齐数的整数倍
//union u1
//{
//	char c[5];
//	int i;
//};
////数组里每个数占一个字节，对齐数为1，int对齐数为4，
////        0   1  2   3   4
////        c   c  c   c   c
////      5不是最大对齐数整数倍，要让其字节数变为8
//union u2
//{
//	short c[7];
//	//总共占14字节，对齐数为1
//	int i;
//	//占4字节，对齐数为4
//	//变为16
//};
//int main()
//{
//	printf("%zd\n", sizeof(union u1));
//	printf("%zd\n", sizeof(union u2));
//
//	return 0;
//}
//int check_sys()
//{
//	union
//	{
//		int i;
//		char c;
//	}un;
//	un.i = 1;
//	return un.c;
//}
//
//int main()
//{
//	int i = 1;
//	int ret = check_sys();
//	if (ret == 1)
//	{
//		printf("小端存储");
//	}
//	else
//	{
//		printf("大端存储");
//	}
//}
#include<string.h>
struct gift_list
{
	int stock_number;//库存量 
	double price; //定价 
	int item_type;//商品类型 

	union {
		struct
		{
			char title[20];//书名 
			char author[20];//作者 
			int num_pages;//⻚数 
		}book;
		struct
		{
			char design[30];//设计 
		}mug;
		struct
		{
			char design[30];//设计 
			int colors;//颜⾊ 
			int sizes;//尺⼨ 
		}shirt;
	}item;
};

//int main()
//{
//	struct gift_list list = { 0 };
//
//	strcpy(list.item.book.title, "xbc");//
//	list.item.book.title="xbc"//明显错误，首元素地址赋值？数组已经定义好了，在无法赋值了
//	                                       int a[10]={10};
//	                                         a=2?  显然错误
//	list.item.book.title[20] = "xbc";   错误，给数组第20个元素赋值？
//	printf("%s\n", list.item.book.title);
//	return 0;
//}
int main()
{
	struct gift_list list = { .item.book.title = {"xbc"} ,.item_type = 2 };//使用联合体，只可以使用一次联合体内的内容，因为都储存在同一片空间。
	printf("%s\n", list.item.book.title);
	return 0;
}






//枚举  把可能的值一一列举,枚举类似define，枚举完即可使用。
//enum day
//{
//	MON,
//	TUES,
//	WED,
//	THUR,
//	FRI,
//	SAT,
//	SUN,
//};
////里面存放的是枚举的可能取值，叫做枚举常量。
////默认这些值是从0开始，依次加一
//int main()
//{
//	printf("%d %d %d\n", MON, TUES, WED);
//	enum day day1 = MON;//用枚举常量给枚举变量赋值
//	printf("%d\n", day1);
//}